#ifndef GPS_ESWIN_H
#define GPS_ESWIN_H

#include "uart_driver.h"
#include "status.h"
#include <string.h>
#include "../board/sdk_project_config.h"

// GPS 数据结构定义
typedef struct {
    uint8_t hour;  // 时
    uint8_t min;   // 分
    uint8_t sec;   // 秒
    uint16_t year; // 年
    uint8_t month; // 月
    uint8_t date;  // 日
} UTC_TIME;

typedef struct {
    uint8_t num;     // 卫星编号
    uint8_t eledeg;  // 卫星仰角
    uint16_t azideg; // 卫星方位角
    uint8_t sn;      // 卫星信噪比
} NMEA_SLMSG;

typedef struct {
    UTC_TIME utc;         // UTC 时间
    uint32_t latitude;    // 纬度(分格式)
    uint8_t nshemi;       // 北纬/南纬,N:北纬;S:南纬
    uint32_t longitude;   // 经度(分格式)
    uint8_t ewhemi;       // 东经/西经,E:东经;W:西经
    uint8_t gpssta;       // GPS 状态:0,未定位;1,非差分定位;2,差分定位;6,正在估算.
    uint8_t posslnum;     // 用于定位的卫星数
    uint8_t possl[12];    // 用于定位的卫星编号
    uint8_t fixmode;      // 定位类型:1,未定位;2,2D定位;3,3D定位
    uint16_t pdop;        // PDOP 位置精度因子
    uint16_t hdop;        // HDOP 水平精度因子
    uint16_t vdop;        // VDOP 垂直精度因子
    int32_t altitude;     // 海拔高度(厘米)
    uint16_t speed;       // 地面速率(米/时)
    uint8_t svnum;        // 可见卫星总数
    NMEA_SLMSG slmsg[12]; // 最多12颗卫星信息
} nmea_msg;

////////////////////////////////////////////////////////////////////////////////////////////////////
// UBLOX NEO-6M 配置(清除,保存,加载等)结构体

typedef struct
{
    uint16_t header;    // cfg header,固定为0X62B5(小端模式)
    uint16_t id;        // CFG CFG ID:0X0906 (小端模式)
    uint16_t dlength;   // 数据长度 12/13
    uint32_t clearmask; // 子区域清除掩码(1有效)
    uint32_t savemask;  // 子区域保存掩码
    uint32_t loadmask;  // 子区域加载掩码
    uint8_t devicemask; // 目标器件选择掩码	b0:BK RAM;b1:FLASH;b2,EEPROM;b4,SPI FLASH
    uint8_t cka;        // 校验CK_A
    uint8_t ckb;        // 校验CK_B
} _ublox_cfg_cfg;

// UBLOX NEO-6M 消息设置结构体

typedef struct
{
    uint16_t header;  // cfg header,固定为0X62B5(小端模式)
    uint16_t id;      // CFG MSG ID:0X0106 (小端模式)
    uint16_t dlength; // 数据长度 8
    uint8_t msgclass; // 消息类型(F0 代表NMEA消息格式)
    uint8_t msgid;    // 消息 ID
                      // 00,GPGGA;01,GPGLL;02,GPGSA;
                      // 03,GPGSV;04,GPRMC;05,GPVTG;
                      // 06,GPGRS;07,GPGST;08,GPZDA;
                      // 09,GPGBS;0A,GPDTM;0D,GPGNS;
    uint8_t iicset;   // IIC消输出设置    0,关闭;1,使能.
    uint8_t uart1set; // UART1输出设置	   0,关闭;1,使能.
    uint8_t uart2set; // UART2输出设置	   0,关闭;1,使能.
    uint8_t usbset;   // USB输出设置	   0,关闭;1,使能.
    uint8_t spiset;   // SPI输出设置	   0,关闭;1,使能.
    uint8_t ncset;    // 未知输出设置	   默认为1即可.
    uint8_t cka;      // 校验CK_A
    uint8_t ckb;      // 校验CK_B
} _ublox_cfg_msg;

// UBLOX NEO-6M UART端口设置结构体

typedef struct
{
    uint16_t header;       // cfg header,固定为0X62B5(小端模式)
    uint16_t id;           // CFG PRT ID:0X0006 (小端模式)
    uint16_t dlength;      // 数据长度 20
    uint8_t portid;        // 端口号,0=IIC;1=UART1;2=UART2;3=USB;4=SPI;
    uint8_t reserved;      // 保留,设置为0
    uint16_t txready;      // TX Ready引脚设置,默认为0
    uint32_t mode;         // 串口工作模式设置,奇偶校验,停止位,字节长度等的设置.
    uint32_t baudrate;     // 波特率设置
    uint16_t inprotomask;  // 输入协议激活屏蔽位  默认设置为0X07 0X00即可.
    uint16_t outprotomask; // 输出协议激活屏蔽位  默认设置为0X07 0X00即可.
    uint16_t reserved4;    // 保留,设置为0
    uint16_t reserved5;    // 保留,设置为0
    uint8_t cka;           // 校验CK_A
    uint8_t ckb;           // 校验CK_B
} _ublox_cfg_prt;

// UBLOX NEO-6M 时钟脉冲配置结构体

typedef struct
{
    uint16_t header;       // cfg header,固定为0X62B5(小端模式)
    uint16_t id;           // CFG TP ID:0X0706 (小端模式)
    uint16_t dlength;      // 数据长度
    uint32_t interval;     // 时钟脉冲间隔,单位为us
    uint32_t length;       // 脉冲宽度,单位为us
    signed char status;    // 时钟脉冲配置:1,高电平有效;0,关闭;-1,低电平有效.
    uint8_t timeref;       // 参考时间:0,UTC时间;1,GPS时间;2,当地时间.
    uint8_t flags;         // 时间脉冲设置标志
    uint8_t reserved;      // 保留
    signed short antdelay; // 天线延时
    signed short rfdelay;  // RF延时
    signed int userdelay;  // 用户延时
    uint8_t cka;           // 校验CK_A
    uint8_t ckb;           // 校验CK_B
} _ublox_cfg_tp;

// UBLOX NEO-6M 刷新速率配置结构体

typedef struct
{
    uint16_t header;   // cfg header,固定为0X62B5(小端模式)
    uint16_t id;       // CFG RATE ID:0X0806 (小端模式)
    uint16_t dlength;  // 数据长度
    uint16_t measrate; // 测量时间间隔，单位为ms，最少不能小于200m（5Hz）
    uint16_t navrate;  // 导航速率（周期），固定为1
    uint16_t timeref;  // 参考时间：0=UTC Time；1=GPS Time；
    uint8_t cka;       // 校验CK_A
    uint8_t ckb;       // 校验CK_B
} _ublox_cfg_rate;

int NMEA_Str2num(uint8_t *buf, uint8_t *dx);
void NMEA_GPGSV_Analysis(nmea_msg *gpsx, uint8_t *buf);
void NMEA_GPGGA_Analysis(nmea_msg *gpsx, uint8_t *buf);
void NMEA_GPGSA_Analysis(nmea_msg *gpsx, uint8_t *buf);
void NMEA_GPGSA_Analysis(nmea_msg *gpsx, uint8_t *buf);
void NMEA_GPRMC_Analysis(nmea_msg *gpsx, uint8_t *buf);
void NMEA_GPVTG_Analysis(nmea_msg *gpsx, uint8_t *buf);
uint8_t Ublox_Cfg_Cfg_Save(void);
uint8_t Ublox_Cfg_Msg(uint8_t msgid, uint8_t uart1set);
uint8_t Ublox_Cfg_Prt(uint32_t baudrate);
uint8_t Ublox_Cfg_Tp(uint32_t interval, uint32_t length, signed char status);
uint8_t Ublox_Cfg_Rate(uint16_t measrate, uint8_t reftime);

// 串口缓冲区大小
#define GPS_UART_Rx_BUFFER_SIZE 1024
#define GPS_UART_Tx_BUFFER_SIZE 256
// GPS 模块初始化
status_t GPS_Init();

// 读取 GPS 数据
status_t GPS_ReadData(nmea_msg *gpsData);

// 处理接收到的 GPS 数据
void GPS_ProcessData(uint8_t *data, uint16_t length);

// 解析 NMEA 数据
void GPS_Analysis(nmea_msg *gpsx, uint8_t *buf);

#endif // GPS_ESWIN_H


#ifdef EXAMPLE
#include "gps_eswin.h"
#include "log.h"

// 定义 UART 实例 (根据实际硬件)
#define GPS_UART_INSTANCE (4U)

int main(void)
{
    // 初始化系统
    CLOCK_SYS_Init(g_pstClockManConfigsArr[0]);
    
    // 初始化 GPS 模块
    nmea_msg gpsData;
    status_t status = GPS_Init(GPS_UART_INSTANCE);
    
    if (status != STATUS_SUCCESS) {
        log_error("GPS initialization failed");
        return -1;
    }
    
    log_info("GPS module initialized");
    
    while (1) {
        // 读取 GPS 数据
        status = GPS_ReadData(&gpsData);
        
        if (status == STATUS_SUCCESS) {
            // 处理 GPS 数据
            log_info("Time: %02d:%02d:%02d", 
                     gpsData.utc.hour, gpsData.utc.min, gpsData.utc.sec);
            log_info("Latitude: %f, Longitude: %f", 
                     gpsData.latitude / 100000.0, gpsData.longitude / 100000.0);
            log_info("Altitude: %d cm, Speed: %d cm/s", 
                     gpsData.altitude, gpsData.speed);
            log_info("Satellites: %d in view, %d used", 
                     gpsData.svnum, gpsData.posslnum);
        }
        
        OS_DelayMs(1000); // 每秒读取一次
    }
}
#endif